/**
 * Created By zhangQ 2018/3/1
 * 1.封装 localStorage，增加配置项，比如时间戳
 */
let config = {
  expiration: (1000 * 60) * 30, // 到期时间 30 分钟,此设置和后台保持一致
  prefix: 'xlink',
  activeDate: ''
}
let lockr = window.localStorage
let utils = {
  getActiveDate () {
    config.activeDate = +lockr.getItem(config.prefix + '_activeDate')
  }
}

let lockrMethods = {
  /**
   * TODO(注册活跃时间)
   * @param
   * @auther zhangQ
   * @date 2018/3/5 16:54
   **/
  setActiveDate () {
    config.activeDate = Date.now()
    lockr.setItem(config.prefix + '_activeDate', Date.now())
  },
  /**
   * TODO(lockr 获取参数)
   * @param key
   * @param defaultValue默认值,默认为null
   * @auther zhangQ
   * @date 2018/3/1 11:16
   **/
  get (key, defaultValue = null) {
    utils.getActiveDate()
    try {
      let storageObj = JSON.parse(lockr.getItem(config.prefix + '_' + key))
      if (!storageObj.expiration || (config.activeDate + storageObj.expiration) > Date.now()) {
        return storageObj.data
      } else {
        return defaultValue
      }
    } catch (err) {
      lockrMethods.set(key, defaultValue)
      return defaultValue
    }
  },
  /**
   * TODO()
   * @param key
   * @param value
   * @param needles 不定参数 第一个 参数是否过期 true 过期，false 不过期 ，第二个参数过期时间戳
   * @auther zhangQ
   * @date 2018/3/1 11:31
   **/
  set (key, value, ...needles) {
    if (!key) {
      throw Error('lockr:', 'waring:lockr set() Key 不为空')
    }
    let storageObj = {
      data: value
    }
    if (needles[0] === undefined || needles[0]) {
      if (needles[1]) {
        storageObj.expiration = +needles[1] // 到期时间
      } else {
        storageObj.expiration = config.expiration // 到期时间
      }
    }
    lockr.setItem(config.prefix + '_' + key, JSON.stringify(storageObj))
  },
  flush () {
    lockr.clear()
  },
  rm (key) {
    if (!key) {
      throw Error('lockr:', 'waring:lockr rm() Key 不为空')
    }
    lockr.removeItem(config.prefix + '_' + key)
  },
  keys () {
    return lockr.keys()
  }
}

export default lockrMethods
